package fr.gestproj.utils;

import fr.gestproj.facade.UtilisateurFacade;
import fr.gestproj.model.Utilisateur;
import java.util.Date;
import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.authentication.encoding.ShaPasswordEncoder;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;

/**
 *
 * @author Parrot
 */
public abstract class UtilsAuthentication {

    /**
     * Constructeur de la classe <code>UtilsAuthentication</code>.
     */
    private UtilsAuthentication() {
    }

    /**
     * Chiffre le mot de passe d'un utilisateur.
     *
     * @param password {@link String} le mot de passe à chiffrer.
     * @param date {@link Date} la date a utiliser
     * @return {@link String} Le mot de passe chiffré.
     */
    public static String chiffrerMotdepasse(String password, Date date) {
        return new ShaPasswordEncoder(512).encodePassword(password, date);
    }

    /**
     * Recupere le username de l'utilisateur loggué
     *
     * @return {@link String}.
     */
    public static String getLogin() {
        String login = null;
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication != null) {
            login = authentication.getName();
        }
        return login;
    }

    /**
     * Retourne l'utilisateur qui se trouve en session
     *
     * @return {@link Object}
     */
    public static Utilisateur getUserSession() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication != null && (authentication.getDetails() instanceof Utilisateur)) {
            return (Utilisateur) UtilsAuthentication.getAuthentication().getDetails();
        }
        if (authentication != null && (authentication.getPrincipal() instanceof Utilisateur)) {
            return (Utilisateur) UtilsAuthentication.getAuthentication().getPrincipal();
        }
        return null;
    }

    /**
     * Retourne l'authentication du contexte de sécurité
     *
     * @return {@link Authentication}
     */
    public static Authentication getAuthentication() {
        return SecurityContextHolder.getContext().getAuthentication();
    }

    /**
     * Retourne le contexte de sécurité
     *
     * @return {@link SecurityContext}
     */
    public static SecurityContext getSecurityContext() {
        return SecurityContextHolder.getContext();
    }

    /**
     * Modifie le userdetails en session dans le security context
     */
    public static void updateUserDetailsSession() {
        ((AbstractAuthenticationToken) UtilsAuthentication.getAuthentication()).setDetails(UtilsMetier.getBean(UtilisateurFacade.class).find(getUserSession().getId()));
    }

    /**
     * Modifie le userdetails dans le security context
     *
     * @param idUtilisateur {@link Integer}
     */
    public static void updateUserDetails(Integer idUtilisateur) {
        ((AbstractAuthenticationToken) UtilsAuthentication.getAuthentication()).setDetails(UtilsMetier.getBean(UtilisateurFacade.class).find(idUtilisateur));
    }

    /**
     * retourne vrai si l'utilisateur est au moins dans un des roles passés en
     * paramètre
     *
     * @param roles {@link String}...
     * @return boolean
     */
    public static boolean isUserInRoles(String... roles) {
        for (String role : roles) {
            if (getUserSession().getAuthorities().contains(new SimpleGrantedAuthority(role))) {
                return true;
            }
        }
        return false;
    }

}
